#include <stdio.h>
#include <stdlib.h>
#include <conio.h> 
#include <windows.h>

void gotoxy(int x,int y)		//光标移动到（x，y）的位置 
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle,pos); 
} 

void HideCursor()				//隐藏光标 
{
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}


int position_x,position_y;		//飞机的位置，x竖着，y横着 
int high,width;					//背景大小 
int bullet_x,bullet_y;			//子弹位置 
int enemy_x,enemy_y;			//敌机位置 
int score;						//游戏得分 

void startup()					//数据初始化
{
	high=20;					//高 
	width=40;					//宽 
	
	position_x=high/2;
	position_y=width/2;
	
	bullet_x=0;
	bullet_y=position_y;
	
	enemy_x=-1;
	enemy_y=position_y+1;
	
	score=0;
	
	 HideCursor();
} 
void show()						//显示界面 
{
	int i,j;
	
	gotoxy(0,0);				//光标移动到原点位置，以下重新清屏 
	for(i=0;i<high;i++)
	{
		for(j=0;j<width;j++)
		{
			if((i == position_x) && (j == position_y))
			printf("  *");		//输出飞机 
			if((i == position_x+1) && (j == position_y))
			printf("*****");		//输出飞机 
			if((i == position_x+2) && (j == position_y))
			printf(" * *");		//输出飞机 
			else if((bullet_x == i) && (bullet_y+2 == j))
			printf("|");		//输出子弹 
			else if((enemy_x == i) && (enemy_y == j))
			printf("@");		//输出敌机 
			else
			printf(" ");		//输出空格 
		}
		printf("\n");
	}
	printf("score=%d\n",score); //输出得分 
}

void updatewith()				//与用户输出有关 
{
	char input;					//控制移动 
	
	if (kbhit())
	{
		input = getch();
		if(input == 'w')		//向上移动 
		position_x--;
		if(input == 's')		//向下移动 
		position_x++;
		if(input == 'a')		//向左移动 
		position_y--; 
		if(input == 'd')		//向右移动 
		position_y++; 
		if(input == ' ')		//发射子弹 
		{
			bullet_x=position_x-1;
			bullet_y=position_y;
		}
	}
}

void updatewithout()			//与用户输出无关 
{
	if (bullet_x > -1)
		bullet_x--;
	if ((bullet_x == enemy_x) && (bullet_y+2 == enemy_y))  //子弹击中敌机
	{
		score++;
		enemy_x = -1;    		// 产生新的飞机
		enemy_y = rand() % width;
		bullet_x = -2;
	}
	if (enemy_x > high)
	{
		enemy_x = -1;
		enemy_y = rand() % width;
	}

	static int speed = 0,x=10;
	if (speed < x)
		speed++;
	if (speed == x)
	{
		enemy_x++;
		speed = 0;
	}
	if(score>=20)
	x=(score/10)*10;			//随着得分增加，敌机下落速度增加 
	
	if(position_x>high-1)
	position_x=high-1;				//控制飞机不飞出边界
	if(position_x<0)
	position_x=0;
	if(position_y<0)
	position_y=0;
	if(position_y>width-1)
	position_y=width-1;
}
 
int main() 
{
	startup();					//数据初始化
	while(1)					//游戏循环执行 
	{
		show();					//显示界面 
		updatewith();			//与用户输出有关 
		updatewithout();		//与用户输出无关 
	} 
	return 0;
}